package LeetCode;

//给你两个二进制字符串，返回它们的和（用二进制表示）。
//输入为 非空 字符串且只包含数字 1 和 0。
public class Num67 {
    public String addBinary(String a, String b) {
        //自己写
            int i = a.length() - 1;
            int j = b.length() - 1;
            int carry = 0;
            StringBuilder builder = new StringBuilder();
            //循环相加两个字符串相同长度的低位数部分
            while (i >= 0 && j >= 0) {
                int sum = carry;
                sum += a.charAt(i--) - '0';
                sum += b.charAt(j--) - '0';
                carry = sum / 2;
                builder.append(sum % 2);
            }
            // 如果 a 还没遍历完成（a串比b串长），则继续遍历添加 a 的剩余部分
            while (i >= 0) {
                int sum = carry + a.charAt(i--) - '0';
                carry = sum / 2;
                builder.append(sum % 2);
            }
            // 如果 b 还没遍历完成（b串比a串长），则继续遍历添加 b 的剩余部分
            while (j >= 0) {
                int sum = carry + b.charAt(j--) - '0';
                carry = sum / 2;
                builder.append(sum % 2);
            }
            //如果 carry 不等于0 还有个进位数没加进去，需要补充
            if (carry == 1) {
                builder.append(carry);
            }
            //反转字符串获得正常结果
            return builder.reverse().toString();
        //调用StringBuffer方法
//        StringBuffer p = new StringBuffer();
//        int temp = 0;
//        int n = Math.max(a.length(), b.length());
//        for (int i = 0; i < n; i++) {
//            temp += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
//            temp += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
//            p.append((char) (temp % 2 + '0'));
//            temp /= 2;
//        }
//        if (temp > 0) {
//            p.append('1');
//        }
//        p.reverse();
//        return p.toString();
    }
}
